在學習程式語言時,方法的使用是絕對無法避免的,而參數(parameter)與引數(argument)這兩個名詞,的確很容易使初學者混亂。
"We will generally use parameter for a variable named in the parenthesized list in a function definition, and argument for the value used in a call of the function. The terms formal argument and actual argument are sometimes used for the same distinction." -—《The C Programming Language》Section 1.7 K&R
parameter, argument, formal parameter, formal argument, actual argument,這幾個名詞隨著時代輪流的被提出也依次的被替換,目的其實就是為了讓學習程式語言的人能有一個更嚴謹的定義而不搞混。簡單的說,參數就是此方法所需要的變數,而引數就是對應給參數的值。
舉個例子:參數就是考場中的應到人數,每個位子都有期望的考生入座,而引數就是實際來的考生,引數錯誤就是缺考或是有多餘的人跑錯考場。如同一個考試可以團體報名、個人報名或同等學歷報名一樣,引數的帶入也有多種方式。
class Introduction
def initialize(name, age, email, city, language)
@name = name
@age = age
@email = email
@city = city
@language = language
end
def say
puts "我的名字是:#{@name},年紀:#{@age},可以用#{@email}聯絡我,標準#{@city}人,正在學習#{@language},請多指教! "
end
end
def initialize(name, age, email, city = "Taipei", language = "Ruby")
#...下略
Keyword Argument
一樣也可以加上預設值。class Introduction
def initialize(name:, age:, email: , city: "Taipei", language: "Ruby")
@name = name
@age = age
@email = email
@city = city
@language = language
end
def say
puts "我的名字是:#{@name},年紀:#{@age},可以用#{@email}聯絡我,標準#{@city}人,正在學習#{@language},請多指教! "
end
end
Karen = Introduction.new(age: 18, email: "cute@cjhan.tw", name: "Karen")
Karen.say
到目前為止應該會有人會覺得那用 Hash 就好了啊,感覺效果是一樣的,所以 optional hash
跟 keyword argument
到底差在哪裡呢?想像一下今天的自我介紹是要用在正式場合的,那麼所給的資料當然不能用預設值來打混過去吧!
class Introduction
def initialize(profile)
@name = profile[:name]
@age = profile[:age]
@email = profile[:email]
@city = profile[:city]
@language = profile[:language]
end
def say
puts "我的名字是 #{@name},今年 #{@age} 歲,可以用 #{@email} 聯絡我,標準#{@city}人,正在學習 #{@language},請多指教! "
end
end
Karen = Introduction.new(name: "Karen", email: "cute@cjhan.tw", language: "Ruby")
Karen.say
如果是用 optinal hash
的話引數少給也不會產生錯誤訊息;而如果用 keyword argument
的話可以看到因引數錯誤的訊息,也會提示少給了哪幾項引數。
class Introduction
def initialize(name:, age:, email: ,city: , language: )
@name = name
@age = age
@email = email
@city = city
@language = language
end
def say
puts "我的名字是:#{@name},年紀:#{@age},可以用#{@email}聯絡我,標準#{@city}人,正在學習#{@language},請多指教! "
end
end
Karen = Introduction.new(name: "Karen", email: "cute@cjhan.tw", language: "Ruby")
Karen.say # missing keywords: age, city
明天我們來把剩下的引數帶入方式介紹完。
此文同步刊登於CJ-Han的網站